﻿package com.game.utils
{
	import avmplus.getQualifiedClassName;
	
	import com.adobe.serialization.json.JSON;
	import com.game.btnClass.AddMouseEvent;
	
	import flash.display.*;
	import flash.geom.Point;
	import flash.utils.getDefinitionByName;
	
	public class GlobalFun extends Object
	{
		
		public function GlobalFun()
		{
		}
		/**
		 * 获取某值的浮动值
		 * @param num:基础值
		 * @param rNum:浮动值
		 * */
		public static function numReduce(num:Number,rNum:Number):Number{
			
			if(num>0){
				num-=Math.abs(rNum);
				
			}else if(num<0){
				num+=Math.abs(rNum);
			}
			return num;
		}
		/**
		 *	GC对象
		 * @param obj:对象
		 * */
		public static function gcObj(obj:Object):void{
			if(obj==null){
				return;
			}
			if(obj.hasOwnProperty("gc")){
				obj["gc"]();
			}
		}
		/**
		 * 清除影片剪辑
		 * @param _gcMcList 影片剪辑列表
		 */
		public static function gcMc(_gcMcList:Array):void{
			for (var i:int = 0; i < _gcMcList.length; i++)
				
			{
				if(_gcMcList[i]!=null){
					(_gcMcList[i] as MovieClip).gotoAndStop("gc");
				}
				
			}
			
			
		}
		/**
		 * 检查地址里是否有http://
		 * @param url:地址
		 * */
		
		public static function CheckHttp(url:String):Boolean{
			if(url.indexOf("http://")!=-1){
				return true;
			}
			return false;
		}
		/**
		 * 清理loader
		 * 
		 * */
		public static function gcLoader(_loader:Loader):void{
			try {
				_loader.close();
			} catch(error:Error){
			}
			try {
				_loader.unload();
			} catch (error:Error){
			}
			try {
				_loader.unloadAndStop();
			} catch (error:Error){
			}
		}
		/**
		 * 获得天数差
		 * @param sTimeStamp 开始时间戳
		 * @param eTimeStamp 结束时间戳
		 * */
		public static function getDays(sTimeStamp:uint,eTimeStamp:uint):int{
			var sDate:Date=new Date(sTimeStamp*1000);
			var eDate:Date=new Date(eTimeStamp*1000);
			var _year:int=(eDate.fullYear-sDate.fullYear)
			var _month:int=(eDate.month-sDate.month);
			var _date:int=eDate.date-sDate.date;
			var _dates:int=_year*365+_month*30+_date;
			return _dates;
			
		}
		
		/**
		 * 转换时间格式
		 * @param time 时间(秒)
		 * @param type 类型,0:"00:00:00",1:"00小时00分钟00秒"
		 * @return 
		 */
		public static function changeTimeStr(time:uint,type:uint=0):String{
			if (time<=0) {
				if(type==0){
					return "00:00:00";
				}else if(type==1){
					return "0";
				}
				
			}
			var _num:uint = time%(3600*24);
			var thisD:uint = Math.floor(time/(3600*24));
			var thisH:uint = Math.floor(_num/3600);
			var thisM:uint = Math.floor((_num%3600)/60);
			var thisS:uint = Math.floor((_num%3600)%60);
			var _str:String = "";
			if(thisD>0){
				type=1;
			}
			if(type==0){
				if(thisH<10){
					_str+="0"+thisH+":";
				}else{
					_str+=thisH+":";
				}
				if (thisM<10) {
					_str += "0"+thisM+":";
				} else{
					_str += thisM+":";
				}
				if (thisS<10) {
					_str += "0"+thisS;
				} else{
					_str += thisS;
				}
				
			}else if(type==1){
				if (thisD>0) {
					_str = thisD+"天";
				}
				if (thisH>0) {
					_str += thisH+"小时";
				}
				if (thisM>0) {
					_str += thisM+"分";
				} else if (thisH>0 && thisS>0) {
					_str += "零";
				}
				if (thisS>0) {
					_str += thisS+"秒";
				}
			}
			return _str;
			
		}
		
		/**
		 * 深度复制对象
		 * 
		 * */
		public static function cloneObject(source:Object) :* {
			var typeName:String = getQualifiedClassName(source);//获取全名
			var type:Class = getDefinitionByName(typeName) as Class;//获取Class
			var _obj:*=new type();
			var _tempObj:Object=JSON.decode(JSON.encode(source));
			GlobalFun.setObjData(_obj,_tempObj);
			return _obj;
		}
		/**
		 * 删除所有鼠标事件
		 * 
		 * */
		public static function delListMouseEvent(arr:Vector.<AddMouseEvent>):void{
			if(arr==null){
				return;
			}
			for(var i:uint=0;i<arr.length;i++){
				if(arr[i]!=null){
					if(arr[i].delMouseEvent!=null){
						arr[i].delMouseEvent();
					}
				}
				
				arr[i]=null;
			}
			
		}
		/**
		 * 改变point值
		 *@param point:point
		 *@param num:随机值
		 **/
		public static function randPoint(point:Point,num:uint):Point{
			point.x+=GlobalFun.getRanNum(num,-1); 
			point.y+=GlobalFun.getRanNum(num,-1);
			return point
		}
		/**
		 * 获得随机数
		 *@param num:随机值
		 *@param type:范围,0:0-(num-1),-1:(-num+1)-(num-1);
		 **/
		public static function getRanNum(num:int,type:int=0) : int
		{
			var _num:int=0;
			if(type==0){
				_num=Math.random() * num >> 0;
			}else if(type==-1){
				_num=(Math.random() * num >> 0)-(Math.random() * num >> 0);
			}
			return _num;
		}
		/**
		 * 随机获得数据的元素
		 *@param arr:数组
		 *@param isDel>>true:删除该元素,false:不删除
		 **/
		public static function getRanArr(arr:Array,isDel:Boolean=false):*{
			if(isDel){
				return arr.splice(getRanNum(arr.length),1);
			}else{
				return arr[getRanNum(arr.length)];
			}
		}
		
		/**
		 * 移除一个显示对象
		 *@param disObj:显示对象
		 **/
		public static function removeDisObj(disOb:DisplayObjectContainer):void{
			if(disOb==null){
				return;
			}
			if(disOb.parent){
				disOb.parent.removeChild(disOb);
			}
		}
		/**
		 * 移除某容器里的所有元素
		 *@param disObj:容器
		 *@param type>>0:只移除该容器内所有显示元素,1:移除该容器及该容器内所有显示元素
		 **/
		public static function removeAllDisObj(disObj:DisplayObjectContainer,type:uint=0):void{
			
			if(disObj==null){
				return;
			}
			var _total:int=disObj.numChildren
			for(var i:int=0;i<_total;i++){
				disObj.removeChildAt(0)
			}
			if(type==1){
				disObj.parent.removeChild(disObj);
			}
		}
		
		/**
		 * 彻底删除容器及容器内的所有元素
		 *@param _this:该容器的父级
		 *@param _name>>该容器的名称
		 **/
		
		public static function delDisObj(_this:Object,_name:String):void{
			if(_this==null){
				return;
			}
			if(!_this.hasOwnProperty(_name)){
				return;
			}
			if(_this[_name]==null){
				return;
			}
			var _totlaNum:uint=_this[_name].numChildren;
			for(var i:int=0;i<_totlaNum;i++){
				_this[_name].removeChildAt(0)
			}
			if(_this.contains(_this[_name])){
				_this.removeChild(_this[_name]);
			}
			_this[_name]=null;
		}
		/**
		 * 是否轮到我
		 * @param isHost 是否为主机;
		 * @param gameTimes 游戏总局数;
		 * @param times 当前局次数;
		 */
		public static function isTurnMe(isHost:Boolean,gameTimes:uint,times:uint):Boolean{
			var _isMe:Boolean=false
			if(gameTimes%2==0){
				_isMe=true;
			}
			if(times%2==0){
				_isMe=!_isMe;
			}
			if(isHost){
				_isMe=!_isMe;
			}
			return _isMe;
			
		}
		/**
		 * 对象赋值
		 * @param mainObj 被赋值对象
		 * @param Obj 数据对象
		 * @param type 0:深度赋值,1:只赋值到第一层,
		 */
		public static function setObjData(mainObj:*,Obj:Object,type:uint=0):void{
			if(!mainObj||!Obj){
				return
			}
			for(var i:* in Obj){
				if(type==1){
					mainObj[i]=Obj[i];
					;
				}else if(Obj[i] is Array){
					if(Obj[i].length>0){
						if(isHasObj(Obj[i])){
							mainObj["set"+i](Obj[i].length);
							for(var n:int=0;n<Obj[i].length;n++){
								if(Obj[i][n] is Array){
									
								}else if(Obj[i][n] is Object){
									setObjData(mainObj[i][n],Obj[i][n]);
								}
							}
						}else{
							mainObj[i]=Obj[i];
						}
					}
				}else if(typeof(Obj[i])=="object"){
					setObjData(mainObj[i],Obj[i]);
				}else{
					mainObj[i]=Obj[i];
				}
			}
		}
		/**
		 * 检查数据元素是否是Obj
		 * @param arr 数组
		 * @return 
		 */
		public static function  isHasObj(arr:Array):Boolean{
			var isHas:Boolean=false
			if(typeof(arr[i])=="object"){
				return true
			}
			
			for(var i:* in arr){
				
				if(arr[i] is Array){
					isHas=isHasObj(arr[i])
					
				}else if(typeof(arr[i])=="object"){
					isHas= true
					
				}
			}
			return isHas
		}
		/**
		 * trace对象里面的元素
		 * @param obj 对象
		 */
		public static function traceForIn(obj:Object):void{
			for(var i:* in obj){
				trace(i,obj[i]);
			}
		}
		
		/**
		 * 生成矩形背景
		 */
		public static function getRect(w:uint,h:uint,color:uint=0,alpha:Number=1):Sprite{
			var _sp:Sprite=new Sprite();
			_sp.graphics.beginFill(color,alpha);
			_sp.graphics.drawRect(0,0,w,h);
			_sp.graphics.endFill();
			return _sp;
		}
		/**
		 * 获取多行列表单个元素point
		 * @param i:序列
		 * @param rowNum:一行的数量
		 * @param disX:x方向距离
		 * @param disY:y方向距离
		 * 
		 * */
		public static function getListPoint(i:uint,rowNum:uint,disX:uint,disY:uint):Point{
			var n:uint=0;
			var point:Point=new Point();
			if(i!=0&&rowNum!=0){
				n=Math.floor(i/rowNum);
			}
			point.x=disX*(i-rowNum*n);
			point.y=disY*n;
			return point;
		}
		/**
		 * 通过经验值得到当前等级
		 * @param list:经验值数组
		 * @param exp:当前经验值
		 * */
		public static function getLevel(list:Array,exp:uint):uint{
			for(var i:uint=0;i<list.length;i++){
				if(i<list.length-1){
					if(exp>=list[i]&&exp<list[i+1]){
						return i+1;
					}
				}else{
					return list.length;
				}
			}
			return 1;
		}
		
		/**
		 * 数组排序
		 * @param obj1 格式  {sort:1,...}
		 * @param obj2 格式  {sort:2,...}
		 */
		public static function sortOnSort(obj1:Object,obj2:Object):Number {
			
			if(obj1.sort > obj2.sort) {
				return 1;
			} else if(obj1.sort < obj2.sort) {
				return -1;
			} else {
				return 0;
			}
		}
		/**
		 * 设置显示对象居中
		 * @param disObj 显示对象
		 * @param width	宽度,如果为-1则获取disObj宽度
		 * @param height 高度,如果为-1则获取disObj高度
		 */
		public static function setDisCenter(disObj:DisplayObject,stage:Stage,width:int=-1,height:int=-1):void{
			
			if(width==-1){
				width=disObj.width;
			}
			if(height==-1){
				height=disObj.height;
			}
			disObj.x=(stage.stageWidth-width)/2;
			disObj.y=(stage.stageHeight-height)/2;
		}
		
	}
}
